package main

import (
	"flag"
	"fmt"
)

// 链式协程
// 如何通过 flag.Int 来解析命令行中的参数以指定协程数量 例如：chaining -n=7000 会生成 7000 个协程。

var ngoroutine = flag.Int("n", 100000, "开启协程的数量")

func f(left, right chan int) { left <- 1 + <-right }

func main() {
	flag.Parse()
	leftMost := make(chan int)
	var left, right chan int = nil, leftMost
	for i := 0; i < *ngoroutine; i++ {
		// 交换left, right, 此时lelfMost在最左边被保留
		left, right = right, make(chan int)
		go f(left, right)
	}
	right <- 0
	res := <-leftMost

	fmt.Println(res)
}
